package com.yz.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

/**
 * @author Sun_Hongmin  by 2018/12/24 16:26
 * 逆向工程启动类入口,使用步骤：（*如果项目之前启动过，要先将之前生成的信息先删除掉）
 *                         1.在config文件中添加数据库连接信息，生成model，mapper位置信息，以及生成表信息
 *                         2.确保数据表名正确后，启动main方法，控制台将输出生成信息日志
 *                         3.刷新项目查看是否生成成功
 */
public class GeneratorSqlMap {
	
	public static void main(String[] args) throws Exception {
		try {
			GeneratorSqlMap generatorSqlmap = new GeneratorSqlMap();
			generatorSqlmap.beforeGenerator();
			generatorSqlmap.generator();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	// 主要工程方法，根据xml配置生成工程信息
	public void generator() throws Exception {
		List<String> warnings = new ArrayList<String>();
		boolean overwrite = true;
		// 指向逆向工程配置文件
		File configFile = new File("generatorConfig.xml");
		ConfigurationParser cp = new ConfigurationParser(warnings);
		Configuration config = cp.parseConfiguration(configFile);
		DefaultShellCallback callback = new DefaultShellCallback(overwrite);
		MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
		myBatisGenerator.generate(null);
	}
	
	//读取properties信息，将表信息配置到xml文件中
	public void beforeGenerator() throws IOException, DocumentException{
		Properties props = new Properties();
		/*File configFile = new File("config.properties");
		props.load(new FileReader(configFile));*/
		props.load(GeneratorSqlMap.class.getClassLoader().getResourceAsStream("config.properties"));
		String tableNameStr = props.getProperty("tablelist");
	        // 创建SAXReader对象
			SAXReader sr = new SAXReader(); // 需要导入jar包:dom4j
			// 关联xml
			Document document = sr.read("generatorConfig.xml");
			// 获取根元素
			Element root = document.getRootElement();
			// 获取context标签
			Element context = root.element("context");
			List<Element> tableAttribute = context.elements("table");
			for(Element attribute:tableAttribute){
				context.remove(attribute);
			}
		String[] tablelist = tableNameStr.split(",");
		for(int i=0;i<tablelist.length;i++){
			// 利用context标签添加属性
			Element table = context.addElement("table");
			table.addAttribute("tableName", tablelist[i]);
			//table下子节点<generatedKey column="id" sqlStatement="MySql" identity="true"/>  插入数据返回主键
			table.addAttribute("tableName", tablelist[i]);
			Element generatedKey = table.addElement("generatedKey");
			generatedKey.addAttribute("column", "id");
			generatedKey.addAttribute("sqlStatement", "mysql");//不知道oracle这里会不会报错
			generatedKey.addAttribute("identity", "true");
			
		}
			// 调用下面的静态方法完成xml的写出
			saveDocument(document, new File("generatorConfig.xml"));
	  }
	
	// 下面的为固定代码---------可以完成java对XML的写,改等操作
	public static void saveDocument(Document document, File xmlFile) throws IOException {
		Writer osWrite = new OutputStreamWriter(new FileOutputStream(xmlFile), "UTF-8");// 创建输出流，*设置文件保存格式
		OutputFormat format = OutputFormat.createPrettyPrint(); // 获取输出的指定格式
		format.setEncoding("UTF-8");// *设置编码格式
		XMLWriter writer = new XMLWriter(osWrite, format);// XMLWriter
															// 指定输出文件以及格式
		writer.write(document);// 把document写入xmlFile指定的文件(可以为被解析的文件或者新创建的文件)
		writer.flush();
		writer.close();
	}
	// https://blog.csdn.net/eson_15/article/details/51694684
	//springmvc [shiro\redis\hibernate\ssm集成] springboot svn git... ... 
}
